home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / libraris / odinlib1 / part01 / odindemo1.c < prev    next >
C/C++ Source or Header  |  1990-09-03  |  3KB  |  127 lines

  1. /***********************************************/
  2. /* odindemo1.c                                 */
  3. /* demo of odin.library                        */
  4. /* starts 2 new processes and sends envelopes  */
  5. /* back and forth.                             */
  6. /* Created 7-Jul-90 by Peter Oerbaek           */
  7. /* This code is in the public domain.          */
  8. /* Link with odinglue.o                        */
  9. /***********************************************/
  10.  
  11. /**********************************************************************
  12.   A lot of checking is ommited in the code to make it smaller and
  13.   easier to read.
  14. **********************************************************************/
  15.  
  16. #include    "exec/types.h"
  17. #include    "exec/semaphores.h"
  18. #include    "stdio.h"
  19. #include    "odin.h"
  20.  
  21. struct OdinBase *OpenLibrary();
  22. struct OdinBase *OdinBase;    /* global base pointer */
  23.  
  24. typedef struct {
  25.     Envelope    env;    /* envelope-prefix used by odin routines */
  26.     int        num;    /* package number */
  27.     int        stop;    /* flag to stop consumers */
  28. } Pack;
  29.  
  30. #define p_sizeof (long)sizeof(Pack)
  31.  
  32. typedef struct {
  33.     Envelope    e;        /* envelope-prefix */
  34.     char        *windowname;    /* name of windowfile to open */
  35. } StartEnv;
  36.  
  37. #define se_sizeof (long)sizeof(StartEnv)
  38.  
  39. /*** for use around C routines that are not re-entrant ***/
  40.  
  41. struct SignalSemaphore    ss;
  42. #define CRIT_REG(s) ObtainSemaphore(&ss); { s } ReleaseSemaphore(&ss);
  43.  
  44. /**** the body for the processes ************/
  45.  
  46. Envelope *processbody(se)
  47. StartEnv *se;
  48. {
  49.     FILE *f;
  50.     int i,stop;
  51.     Pack *p;
  52.  
  53.     CRIT_REG(f = fopen(se->windowname,"w");)
  54.     CRIT_REG(fprintf(f,"Hello world\n");)
  55.     do {
  56.         p = (Pack *)AwaitNamedEnvelope("a packet");
  57.         stop = p->stop;
  58.         CRIT_REG(fprintf(f,"Packet #%d received.\n",p->num);)
  59.         DisposeEnvelope(p);
  60.     } while(stop == 0);
  61.     CRIT_REG(fprintf(f,"Bye, bye...\n");)
  62.     Delay(100L);
  63.     CRIT_REG(fclose(f);)
  64.     return (Envelope *)se;
  65. }
  66.  
  67. main()
  68. {
  69.     StartEnv *env;
  70.     Pack *pack;
  71.     int i;
  72.  
  73.     printf("opening library\n");
  74.     if(!(OdinBase = OpenLibrary("ram:odin.library",0L))) {
  75.         printf("Couldn't open odin.library\n");
  76.         exit(20);
  77.     }
  78.  
  79.     /* set up semaphore */
  80.     InitSemaphore(&ss);
  81.  
  82.     /* Ought to do an AddSemaphore() here, but that doesn't work
  83.      * in my ROM (KS 33.180)
  84.      */
  85.  
  86.     printf("creating new processes\n");
  87.     /* start first process */
  88.     env = (StartEnv *)CreateEnvelope("newprocess1",se_sizeof);
  89.     env->e.e_proc = processbody;
  90.     env->windowname = "CON:10/10/300/100/Proc1";
  91.     Eval(env,1L,4000L,EVAL_PROCESS);
  92.  
  93.     /* start next process */
  94.     env = (StartEnv *)CreateEnvelope("newprocess2",se_sizeof);
  95.     env->e.e_proc = processbody;
  96.     env->windowname = "CON:310/20/300/100/Proc2";
  97.     Eval(env,0L,4000L,EVAL_PROCESS);
  98.  
  99.     /* send some packages */
  100.     for(i = 0; i < 10; i++) {
  101.         pack = (Pack *)CreateEnvelope("a packet",p_sizeof);
  102.         pack->num = i;
  103.         pack->stop = 0;
  104.         Out(pack);
  105.         CRIT_REG(printf("packet #%d sent.\n",i);)
  106.     }
  107.  
  108.     /* send the stop-packages */
  109.     CRIT_REG(printf("sending stop-packets.\n");)
  110.     pack = (Pack *)CreateEnvelope("a packet",p_sizeof);
  111.     pack->stop = 1;
  112.     Out(pack);
  113.  
  114.     pack = (Pack *)CreateEnvelope("a packet",p_sizeof);
  115.     pack->stop = 1;
  116.     Out(pack);
  117.  
  118.     CRIT_REG(printf("waiting for process1 to terminate\n");)
  119.     DisposeEnvelope(AwaitNamedEnvelope("newprocess1"));
  120.     CRIT_REG(printf("waiting for process2 to terminate\n");)
  121.     DisposeEnvelope(AwaitNamedEnvelope("newprocess2"));
  122.  
  123.     printf("closing\n");
  124.     CloseLibrary(OdinBase);
  125. }
  126.  
  127.